//
//  UIButton+Addition.m
//  runtimeTest_isa_消息转发
//
//  Created by Song on 2018/4/26.
//  Copyright © 2018年 Song. All rights reserved.
//

#import "UIButton+Addition.h"

// 声明一个静态的索引key，用于获取被关联对象的值
static char *buttonClickKey;



@implementation UIButton (Addition)

@dynamic block;
// 属性
-(void)setBlock:(ButtonClickCallBack)block {
    objc_setAssociatedObject(self, &buttonClickKey, block, OBJC_ASSOCIATION_COPY);
}
-(ButtonClickCallBack)block {
    return objc_getAssociatedObject(self, &buttonClickKey);
}

-(instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        [self addTarget:self action:@selector(buttonClicked1:) forControlEvents:UIControlEventTouchUpInside];
    }
    return self;
}

// 属性
-(void)buttonClicked1:(UIButton *)button {
    if (self.block) {
        self.block(button);
    }
}



// 方法
-(void)handleClickCallBack:(ButtonClickCallBack)callBack {
    
    /*
     第一个参数:id object : 表示关联的源对象
     第二个参数:const void *key : 获取被关联者的索引key
     第三个参数:id value : 被关联者
     第四个参数:objc_AssociationPolicy policy : 关联策略，一般使用OBJC_ASSOCIATION_RETAIN_NONATOMIC
     */
//    objc_setAssociatedObject(<#id object#>, <#const void *key#>, <#id value#>, <#objc_AssociationPolicy policy#>)
    
    // 关联对象
    // 将button的实例与回调的block通过索引key进行关联：
    objc_setAssociatedObject(self, &buttonClickKey, callBack, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    
    
    // 设置button执行的方法
    [self addTarget:self action:@selector(buttonClicked) forControlEvents:UIControlEventTouchUpInside];
}

// 方法
-(void)buttonClicked {
    
    // 通过静态的索引key，获取被关联对象（这里就是回调的block）
    ButtonClickCallBack callBack = objc_getAssociatedObject(self, &buttonClickKey);
    
    if (callBack) {
        callBack(self);
    }
}

@end
